﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MemoryDuosControl;

namespace MemoryDuosInterfaz
{
    public partial class NuevaMultijugador : Form
    {
        public NuevaMultijugador()
        {
            InitializeComponent();
            this.AcceptButton = buttonAceptar;
        }

        private List<Galería> lista;

        private void buttonAceptar_Click(object sender, EventArgs e)
        {
            AccesoPartida par = new AccesoPartida(Controlador.Instance.UsuarioActual);

            if (listBoxSistema.SelectedItem != null && !textBoxNick.Text.Equals(null) && !listBoxSistema.SelectedItem.ToString().Equals(""))
            {
                try
                {
                    EstadoPeticion obtenerPartida = par.IniciarPartida(textBoxNick.Text, listBoxSistema.SelectedItem.ToString());
                    if (obtenerPartida.Estado)
                    {
                        Cursor.Current = Cursors.WaitCursor;
                        Controlador.Instance.PartidaActual = new Partida();
                        Controlador.Instance.PartidaActual.Codigo = int.Parse(obtenerPartida.Error);
                        Controlador.Instance.PartidaActual.Nick_1 = Controlador.Instance.UsuarioActual.Nick;
                        Controlador.Instance.PartidaActual.Nick_2 = textBoxNick.Text;
                        Controlador.Instance.PartidaActual.Puntuacion_1 = 0;
                        Controlador.Instance.PartidaActual.Puntuacion_2 = 0;
                        Controlador.Instance.PartidaActual.Turno = Controlador.Instance.UsuarioActual.ID;
                        lista = AccesoGaleria.LeerGalerías(listBoxSistema.SelectedItem.ToString());
                        List<Image> devolver = new List<Image>();
                        List<int> ids = new List<int>();
                        progressBar1.Maximum = lista.Count;
                        progressBar1.Value = 0;
                        int iterations = lista.Count;

                        var watch = Stopwatch.StartNew();
                        watch.Start();
                        // the code that you want to measure comes here

                        Cursor.Current = Cursors.WaitCursor;
                        Parallel.ForEach(lista, item =>
                        {
                            Image gal = AccesoGaleria.LeerDeServidor(item);
                            devolver.Add(gal);
                            ids.Add(item.Codigo);
                            BeginInvoke((Action)delegate { progressBar1.Value++; });
                        });
                        Cursor.Current = Cursors.Arrow;
                        TimeSpan ts = watch.Elapsed;

                        ComenzarPartida(devolver, ids);
                    }
                }
                catch (Exception exc)
                {
                    MessageBox.Show(exc.Message);
                }
            }
        }

        private void ComenzarPartida(List<Image> devolver, List<int> codigos)
        {
            if (devolver.Count >= 21)
            {
                TableroMultijugador tablero = new TableroMultijugador();
                tablero.InicializarTablero(devolver, codigos);
                PartidaMultijugador part = new PartidaMultijugador(tablero, true);

                Owner.Hide();

                part.ShowDialog(Owner);
                this.Close();
            }
            else { MessageBox.Show("La lista no contiene las imágenes necesarias."); }
        }

        private void NuevaMultijugador_Load(object sender, EventArgs e)
        {
            lista = AccesoGaleria.LeerGalerías();
            var lista2 = lista.GroupBy(p => p.Nombre).ToList();
            foreach (var nombre in lista2)
            {
                listBoxSistema.Items.Add(nombre.Key);
            }
            listBoxSistema.SelectedIndex = 0;
        }

        private void NuevaMultijugador_FormClosed(object sender, FormClosedEventArgs e)
        {
            Owner.Show();
            Owner.BringToFront();
        }
    }
}
